#include "protocol.hpp"
#include "calculate.hpp"
#include "connection.hpp"

class PackageParse
{
public:
    static void prase(Connection *cnt)
    {
        Calculate cal;
        while (true) // 一直处理请求，依次处理一个完整的报文
        {
            // 1、解包
            string jsonstr = protocol_ns::decoding(cnt->getInbuff());
            if (jsonstr.empty()) // 读到的数据不包含一个完整的报文
                break;
            cout << "recv:" << jsonstr << endl;

            // 2、jsonstr字符串反序列化为Request
            protocol_ns::Request req;
            req.nonSerialized(jsonstr);

            // 3、业务处理
            protocol_ns::Response resp = cal.excute(req);

            // 4、将结果转换成json格式再序列化成字符串
            jsonstr.clear();
            resp.serialized(jsonstr); // jsonstr是输出型参数

            // 5、添加协议报头
            string packstr = protocol_ns::encoding(jsonstr);

            // 6、将协议报文写到connection维护的发送缓冲区
            cout << "echo:" << packstr << endl;
            cnt->appendOutbuf(packstr);
        }

        // 业务处理结束，检查connection的发送缓冲区是否有数据要发送
        if(!cnt->isEmptyOutbuf())
        {
            // 这里有两种处理方式
            // 1、直接调用发送，将connetcion中outbuff缓冲区的数据发送到tcp缓冲区，如果outbuff中数据没有发完_sender函数会触发写关心
            // 这种方式如果一次发完，就不会触发写事件关心
            // cnt->_sender(cnt);

            // // 2、直接开启写事件关心（开启写事件关心，默认直接触发），下次事件派发就会调用_sender进行发送
            cnt->_reactor->enableWriteRead(cnt->getConnectionFd(), true, true);
        }
    }
};